home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / bstring / RCS / ffs.c,v < prev   
Text File  |  1991-12-03  |  4KB  |  184 lines

  1. head     1.3;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.3.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.3
  10. date     89.06.19.14.15.25;  author jhh;  state Exp;
  11. branches 1.3.1.1;
  12. next     1.2;
  13.  
  14. 1.2
  15. date     88.07.19.13.26.51;  author mendel;  state Exp;
  16. branches ;
  17. next     1.1;
  18.  
  19. 1.1
  20. date     88.04.25.21.39.16;  author ouster;  state Exp;
  21. branches ;
  22. next     ;
  23.  
  24. 1.3.1.1
  25. date     91.12.02.21.28.39;  author kupfer;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29.  
  30. desc
  31. @@
  32.  
  33.  
  34. 1.3
  35. log
  36. @now returns 0 if argument is 0 (unix compatible)
  37. @
  38. text
  39. @/* 
  40.  * ffs.c --
  41.  *
  42.  *    Source code for the "ffs" library routine.
  43.  *
  44.  * Copyright 1988 Regents of the University of California
  45.  * Permission to use, copy, modify, and distribute this
  46.  * software and its documentation for any purpose and without
  47.  * fee is hereby granted, provided that the above copyright
  48.  * notice appear in all copies.  The University of California
  49.  * makes no representations about the suitability of this
  50.  * software for any purpose.  It is provided "as is" without
  51.  * express or implied warranty.
  52.  */
  53.  
  54. #ifndef lint
  55. static char rcsid[] = "$Header: /sprite/src/lib/c/bstring/RCS/ffs.c,v 1.2 88/07/19 13:26:51 mendel Exp Locker: jhh $ SPRITE (Berkeley)";
  56. #endif not lint
  57.  
  58. /*
  59.  * The following mask is used to detect proper alignment of addresses
  60.  * for doing word operations instead of byte operations.  It is
  61.  * machine-dependent.  If none of the following bits are set in an
  62.  * address, then word-based operations may be used. This value is imported
  63.  * from machparam.h
  64.  */
  65.  
  66. #include "machparam.h"
  67.  
  68. #define WORDMASK WORD_ALIGN_MASK
  69.  
  70. /*
  71.  * Used to find the first set bit. Value of the array is the index of the
  72.  * first set bit in the array index.
  73.  */
  74. static int lookup[16] = {
  75.     0,    /* 0x0    */
  76.     1,    /* 0x01   */
  77.     2,    /* 0x10   */
  78.     1,    /* 0x11   */
  79.     3,    /* 0x100  */
  80.     1,    /* 0x101  */
  81.     2,    /* 0x110  */
  82.     1,    /* 0x111  */
  83.     4,    /* 0x1000 */
  84.     1,    /* 0x1001 */
  85.     2,    /* 0x1010 */
  86.     1,    /* 0x1011 */
  87.     3,    /* 0x1100 */
  88.     1,    /* 0x1101 */
  89.     2,    /* 0x1110 */
  90.     1    /* 0x1111 */
  91. };
  92.  
  93. /*
  94.  *----------------------------------------------------------------------
  95.  *
  96.  * ffs --
  97.  *
  98.  *    Find the least-significant 1-bit in the argument.
  99.  *
  100.  * Results:
  101.  *    If there are no one-bits in the argument, then 0 is returned.
  102.  *    Otherwise the return value is the index of the least-significant
  103.  *    1 bit, where "1" corresponds to the low-order bit.
  104.  *
  105.  * Side effects:
  106.  *    None.
  107.  *
  108.  *----------------------------------------------------------------------
  109.  */
  110.  
  111. int
  112. ffs(i)
  113.     int i;            /* Value to check for ones. */
  114. {
  115.     register int value, shiftcount;
  116.  
  117.     value = (unsigned int) i;
  118.     for (shiftcount = 0; value != 0; value >>= 4, shiftcount += 4) {
  119.     if (value & 0xf) {
  120.         return (lookup[value & 0xf] + shiftcount);
  121.     }
  122.     }
  123.     return 0;
  124. }
  125. @
  126.  
  127.  
  128. 1.3.1.1
  129. log
  130. @Initial branch for Sprite server.
  131. @
  132. text
  133. @d17 1
  134. a17 1
  135. static char rcsid[] = "$Header: /sprite/src/lib/c/bstring/RCS/ffs.c,v 1.3 89/06/19 14:15:25 jhh Exp $ SPRITE (Berkeley)";
  136. @
  137.  
  138.  
  139. 1.2
  140. log
  141. @Import WORD_ALIGN_MASK from machparam.h.
  142. @
  143. text
  144. @d17 1
  145. a17 1
  146. static char rcsid[] = "$Header: ffs.c,v 1.1 88/04/25 21:39:16 ouster Exp $ SPRITE (Berkeley)";
  147. d33 23
  148. d63 1
  149. a63 1
  150.  *    If there are no one-bits in the argument, then -1 is returned.
  151. d75 1
  152. a75 1
  153.     register int i;            /* Value to check for ones. */
  154. d77 1
  155. a77 1
  156.     register int bitMask, result;
  157. d79 4
  158. a82 3
  159.     for (bitMask = 1, result = 1; bitMask != 0; bitMask <<= 1, result++) {
  160.     if (i & bitMask) {
  161.         return result;
  162. d85 1
  163. a85 1
  164.     return -1;
  165. @
  166.  
  167.  
  168. 1.1
  169. log
  170. @Initial revision
  171. @
  172. text
  173. @d17 1
  174. a17 1
  175. static char rcsid[] = "$Header: ffs.c,v 1.1 88/04/25 13:25:41 ouster Exp $ SPRITE (Berkeley)";
  176. d24 2
  177. a25 2
  178.  * address, then word-based operations may be used.  Eventually this
  179.  * mask needs to be handled in a more machine-independent fashion.
  180. d28 4
  181. a31 1
  182. #define WORDMASK 0x1
  183. @
  184.